package com.mini.grpc.server;

import com.mini.grpc.common.Metadata;
import com.mini.grpc.common.Status;
import com.mini.grpc.common.MethodDescriptor;

/**
 * 服务端调用接口
 * 表示服务端处理的一个RPC调用
 * 
 * @param <ReqT> 请求类型
 * @param <RespT> 响应类型
 * @author Mini-gRPC
 */
public abstract class ServerCall<ReqT, RespT> {
    
    /**
     * 请求指定数量的消息
     * 
     * @param numMessages 请求的消息数量
     */
    public abstract void request(int numMessages);
    
    /**
     * 发送响应头部信息
     * 
     * @param headers 头部信息
     */
    public abstract void sendHeaders(Metadata headers);
    
    /**
     * 发送响应消息
     * 
     * @param message 响应消息
     */
    public abstract void sendMessage(RespT message);
    
    /**
     * 关闭调用
     * 
     * @param status 状态码
     * @param trailers 尾部元数据
     */
    public abstract void close(Status status, Metadata trailers);
    
    /**
     * 判断调用是否已取消
     * 
     * @return 如果已取消返回true
     */
    public abstract boolean isCancelled();
    
    /**
     * 获取方法描述符
     * 
     * @return 方法描述符
     */
    public abstract MethodDescriptor<ReqT, RespT> getMethodDescriptor();
    
    /**
     * 服务端调用监听器抽象类
     * 处理来自客户端的事件
     * 
     * @param <ReqT> 请求类型
     */
    public abstract static class Listener<ReqT> {
        
        /**
         * 接收到消息时调用
         * 
         * @param message 接收到的消息
         */
        public void onMessage(ReqT message) {}
        
        /**
         * 客户端完成发送时调用
         */
        public void onHalfClose() {}
        
        /**
         * 调用被取消时调用
         */
        public void onCancel() {}
        
        /**
         * 调用完成时调用
         */
        public void onComplete() {}
        
        /**
         * 准备接收更多消息时调用
         */
        public void onReady() {}
    }
} 